#ifndef QLSPLUGINSMANAGER_H
#define QLSPLUGINSMANAGER_H

#include <QObject>
#include <QList>
#include <QPluginLoader>
#include <QString>

#include "qls_plugins_manager_global.h"

class QLsPluginService;
class InterfaceInfo;
class QLsThemesManager;

/* 插件信息类 */
class QLS_PLUGINS_MANAGER_EXPORT PluginInfo
{
public:
    QPluginLoader *m_loader;        /* 插件 */
    QLsPluginService *m_interface;      /* 接口 */
    InterfaceInfo *m_interfaceInfo; /* 接口信息(除了窗口) */
    QString m_absFilename;          /* 绝对路径 */
    QString m_filename;             /* 文件名 */
    bool m_isLoaded;                /* 是否加载 */

    /* 构造函数 */
    PluginInfo();
    /* 运算符重载 == */
    bool operator==(const PluginInfo &other);
    /* 运算符重载 >> */
    QList<PluginInfo> &operator>>(QList<PluginInfo> &list);
};

/* 插件管理类 */
class QLS_PLUGINS_MANAGER_EXPORT QLsPluginsManager
{
public:
    QLsPluginsManager(QString pluginsDir = "plugins/QCoreSystem");
    ~QLsPluginsManager();

    /* 运算符重载 == */
    bool operator==(const QLsPluginsManager &other);

    /* 插件路径 */
    QString pluginsDir() const;
    void setPluginsDir(const QString &pluginsDir);

    /* 插件信息配置文件路径 */
    QString pluginsIniDir() const;

    /* 更新本地插件：只获取信息，不直接加载 */
    void RefreshLocalPlugins();

    /* 加载插件 */
    bool LoadPlugin(PluginInfo &info);
    bool LoadPlugin(const QString &filename);

    /* 获取已加载插件列表 */
    QList<PluginInfo> GetPluginsList() const;

    /* 卸载全部插件 */
    void UnloadAllPlugin();

    /* 卸载插件 */
    bool UnloadPlugin(PluginInfo &info);
    bool UnloadPluginByFilename(const QString &filename);
    bool UnloadPluginByAbsFilename(const QString &absFilename);

    /* 根据插件名获取插件信息 */
    PluginInfo GetPluginInfoByInterfaceName(const QString &interfaceName);

    /* 检查必装插件是否加载 */
    bool CheckMustLoadPlugins();
    QStringList mustLoadButDisload() const;

    /* 主题管理系统 */
    QLsThemesManager *themesManager() const;

private:
    QLsThemesManager *m_themesManager; /* 主题管理系统 */

    QString m_pluginsDir;    /* 插件路径 */
    QString m_pluginsIniDir; /* 插件信息配置文件路径 */

    QList<PluginInfo> m_pluginsList;  /* 插件列表 */
    QStringList m_mustLoadButDisload; /* 未装的必装插件 */
};

#endif // QLSPLUGINSMANAGER_H
